package cc.rengu.igas.share.facade.bean;

import cc.rengu.igas.share.facade.bean.cups.*;
import cc.rengu.oltp.utility.util.StringUtil;

import java.io.UnsupportedEncodingException;

/**
 * @author Administrator
 */
public class CupsFieldBean {
    public static final String GB18030 = "GB18030";

    private CupsField cupsField;

    private F60 f60;

    private F61 f61;

    private F90 f90;

    private F104 f104;

    public CupsFieldBean() {
    }

    public CupsFieldBean(CupsField cupsField) {
        this.cupsField = cupsField;
    }

    /**
     * 判断是否为境外受理交易
     *
     * @return
     */
    public boolean isAbroadAcpTxn() {
        //  发送机构为  香港前置
        return isAbroadAcpTxn(getCupsField().getFwdInstCode());
    }

    /**
     * 判断是否为境外受理交易
     *
     * @return
     */
    public static boolean isAbroadAcpTxn(String fwdInstCode) {
        //  发送机构为  香港前置
        return "00010344".equals(fwdInstCode);
    }


    public void build() throws Exception {
        /** 交易货币代码*/
        if (StringUtil.isEmptyOrNull(getCupsField().getOrderCcy()))
            getCupsField().setOrderCcy("156");

        build60();
        //  无卡校验
        build61();
        //  原交易数据域
        build90();
        build104();
        //  密码
        buildPassword();
    }

    public void buildPassword() throws Exception {
        /*52域空*/
        if (StringUtil.isEmptyOrNull(getCupsField().getPinData()))
            return;

        //  域26 服务点PIN获取码     如无长度则设置默认6位密码长度
        if (StringUtil.isEmptyOrNull(getCupsField().getPinCapCode()))
            getCupsField().setPinCapCode("06");

        //  SM4  目前均使用SM4
        getCupsField().setSecCtrlInfo("2400000000000000");
        /*F063-SM用法*/
        getCupsField().setFinNetData("534D303136" + getCupsField().getPinData());
        getCupsField().setPinData("0000000000000000");

    }

    public void buildF0_F3_F18_F25_F60_2_5(F0_F0_F3_F18_F25_F60_2_5 f) {
        cupsField.setMsgType(f.getF0());
        cupsField.setProcCode(f.getF3());
        cupsField.setConCode(f.getF25());
        if (!f.isEmptyF18())
            cupsField.setMchntType(f.getF18());
        if (!f.isEmptyF60_2_5())
            f60.setF60_2_5(f.getF60_2_5());
    }

    public void build60() {
        if (f60 == null || !f60.isF60_Open()) return;

        String msgType = StringUtil.isEmptyOrNull(createF60().getF60_1()) ? "0000" : createF60().getF60_1();

        /*60.2.1-账户所有人类型    默认个人户*/
        String acctType = StringUtil.isEmptyOrNull(createF60().getF60_2_1()) ? F60_2_1_AccountTypeEnum._0.getCode() : createF60().getF60_2_1();

        /*60.2.2-终端读取能力*/
        String termRead = StringUtil.isEmptyOrNull(createF60().getF60_2_2()) ?
                F60_2_2_TerminalEntryCapabilityEnum._0Unknown.getCode() : createF60().getF60_2_2();

        /*60.2.3-IC卡条件代码*/
        String icConCode = StringUtil.isEmptyOrNull(createF60().getF60_2_3()) ?
                F60_2_3_ChipConditionCodeEnum._0.getCode() : createF60().getF60_2_3();
        /*60.2.4-保留使用*/
        String busiType = StringUtil.isEmptyOrNull(createF60().getF60_2_4()) ?
                F60_2_4_BusiProdFlagEnum._0.getCode() : createF60().getF60_2_4();
        //改一下ESB-CUPS类型转换
        /*60.2.5-终端类型   */
        String termType = StringUtil.isEmptyOrNull(createF60().getF60_2_5()) ?
                F60_2_5_TransactionChannelTypeEnum._00.getCode() : createF60().getF60_2_5();
        if (F60_2_5_TransactionChannelTypeEnum._01.getCode().equals(termType)) {
            termType = "01";
        } else if (F60_2_5_TransactionChannelTypeEnum._02.getCode().equals(termType)) {
            termType = "03";
        } else if (F60_2_5_TransactionChannelTypeEnum._03.getCode().equals(termType)
                || F60_2_5_TransactionChannelTypeEnum._04.getCode().equals(termType)) {
            termType = "11";
        } else if (F60_2_5_TransactionChannelTypeEnum._06.getCode().equals(termType)) {
            termType = "06";
        }
        /*60.2.6-受理免验密码标志    默认要检查密码 */
        String noPinFlag = StringUtil.isEmptyOrNull(createF60().getF60_2_6()) ?
                F60_2_6_CheckPsFlagTypeEnum._0_CHECK.getCode() : createF60().getF60_2_6();

        /*60.2.7-IC卡验证可靠性标志   默认授权可靠  */
        String authenticationReliability = StringUtil.isEmptyOrNull(createF60().getF60_2_7()) ?
                F60_2_7_AuthenticationReliabilityEnum._1.getCode() : createF60().getF60_2_7();
        /*60.2.8-电子商务标志   默认未使用 */
        String eci = StringUtil.isEmptyOrNull(createF60().getF60_2_8()) ?
                F60_2_8_ECIEnum._00.getCode() : createF60().getF60_2_8();
        /*60.2.9-交互方式标志   默认缺省*/
        String interActive = StringUtil.isEmptyOrNull(createF60().getF60_2_9()) ?
                F60_2_9_InterActiveEnum._0.getCode() : createF60().getF60_2_9();
        /*60.3.1-特殊计费类型*/
        /*60.3.2-特殊计费档次*/  //  此处同时设置两个字段
        String specialCalcFee = StringUtil.isEmptyOrNull(createF60().getF60_3_1()) ?
                F60_3_1_SpecialCalcFeeEnum._00_0.getCode() : createF60().getF60_3_1();
        //60.3.3-保留使用（第 3 位为 MAC 算法标识)   现在默认国密算法
        String mac = StringUtil.isEmptyOrNull(createF60().getF60_3_3()) ?
                F60_3_3_MACEnum._004.getCode() : createF60().getF60_3_3();
        /*60.3.4-支持部分承兑和返回余额标志*/
        String authAndBalance = StringUtil.isEmptyOrNull(createF60().getF60_3_4()) ?
                F60_3_4_AuthAndBalanceEnum._1.getCode() : createF60().getF60_3_4();
        /*60.3.5-交易发起方式   */
        String txnSendMethod = null;
        if (!StringUtil.isEmptyOrNull(createF60().getF60_3_5())) {
            txnSendMethod = createF60().getF60_3_5();  //  如IC卡脚本通知需要指定0
        } else if (F60_2_5_TransactionChannelTypeEnum._01.getCode().equals(termType)) {
            txnSendMethod = F60_3_5_TxnSendMethodEnum._2.getCode();
        } else {
            txnSendMethod = F60_3_5_TxnSendMethodEnum._1.getCode();
        }

        getCupsField().setReseved(new StringBuilder()
                .append(msgType)
                .append(acctType)
                .append(termRead)
                .append(icConCode)
                .append(busiType)
                .append(termType)
                .append(noPinFlag)
                .append(authenticationReliability)
                .append(eci)
                .append(interActive)
                .append(specialCalcFee)
                .append(mac)
                .append(authAndBalance)
                .append(txnSendMethod)
                .toString());
    }

    public void build61() throws UnsupportedEncodingException {
        //  无需组61
        if (f61 == null || !f61.isF61_Open()) return;

        // 证件类型
        String idType = StringUtil.isEmptyOrNull(createF61().getF61_1_1()) ? "  " : createF61().getF61_1_1();
        // 证件号
        String id = createF61().getF61_1_2();
        id = StringUtil.isEmptyOrNull(id) ? "" : id;
        id = id + String.format("%" + (20 - id.length()) + "s", " ");
        // CVV结果
        String cvvResult = StringUtil.isEmptyOrNull(createF61().getF61_2()) ? " " : createF61().getF61_2();
        // PVV结果
        String pvvResult = StringUtil.isEmptyOrNull(createF61().getF61_3()) ? " " : createF61().getF61_3();
        // 处理中心
        String center = StringUtil.isEmptyOrNull(createF61().getF61_4_1()) ? "   " : createF61().getF61_4_1();
        // 无卡校验值
        String nocardCheck = StringUtil.isEmptyOrNull(createF61().getF61_4_2()) ? "   " : createF61().getF61_4_2();
        // 无卡校验结果
        String nocardCheckResult = StringUtil.isEmptyOrNull(createF61().getF61_4_3()) ? " " : createF61().getF61_4_3();
        // ARQC 认证结果值
        String arqcCheckResult = StringUtil.isEmptyOrNull(createF61().getF61_5()) ? " " : createF61().getF61_5();
        // 处理中心2
        String center2 = StringUtil.isEmptyOrNull(createF61().getF61_6_1()) ? F61_4_1_CenterEnum._CUP.getCode() : createF61().getF61_6_1();

        String str616 = "";
        //  组 NM 用法
        if (F61_6_2_FORMATTER.NM.getCode().equals(createF61().getF61_6_2_FORMATTER())) {
            String name1 = createF61().getF61_6_2_NM_1();
            name1 = StringUtil.isEmptyOrNull(name1) ? "" : name1;
            String name2 = createF61().getF61_6_2_NM_2();
            name2 = StringUtil.isEmptyOrNull(name2) ? "" : name2;

            str616 = createF61().getF61_6_2_FORMATTER() +
                    name1 + String.format("%" + (30 - name1.getBytes(GB18030).length) + "s", " ") +
                    name2 + String.format("%" + (30 - name2.getBytes(GB18030).length) + "s", " ");
        } else if (F61_6_2_FORMATTER.AM.getCode().equals(createF61().getF61_6_2_FORMATTER())) {
            // 16个0初始化位图
            StringBuilder am = new StringBuilder();
            String name = f61.getF61_6_2_AM_2_Name();
            String phone = f61.getF61_6_2_AM_2_Phone();
            String dynCheckValue = f61.getF61_6_2_AM_2_DynCheckValue();
            if (!StringUtil.isEmptyOrNull(f61.getF61_1_1())) {
                // 证件校验
                f61.openF61_6_2_AM_1_BitMap(F61_6_2_BITMAP._3.getCode());
            }
            if (!StringUtil.isEmptyOrNull(name)) {
                // 姓名校验
                f61.openF61_6_2_AM_1_BitMap(F61_6_2_BITMAP._8.getCode());
                String nmLen = String.format("%03d", name.getBytes(GB18030).length);
                am.append(nmLen).append(name);
            }
            if (!StringUtil.isEmptyOrNull(phone)) {
                // 手机号校验
                f61.openF61_6_2_AM_1_BitMap(F61_6_2_BITMAP._9.getCode());
                String phoneLen = String.format("%03d", phone.length());
                am.append(phoneLen).append(phone);
            }
            if (!StringUtil.isEmptyOrNull(dynCheckValue)) {
                // 动态验证码校验
                f61.openF61_6_2_AM_1_BitMap(F61_6_2_BITMAP._9.getCode());
                String phoneLen = String.format("%03d", dynCheckValue.length());
                am.append(phoneLen).append(dynCheckValue);
            }
            str616 = createF61().getF61_6_2_FORMATTER() + f61.getF61_6_2_AM_1_BitMap() + am.toString();
        }

        getCupsField().setCardHoldAuthInfo(idType + id + cvvResult + pvvResult + center + nocardCheck + nocardCheckResult + arqcCheckResult + center2 + str616);
    }

    public void build90() {
        //  无需组90
        if (f90 == null || !f90.isF90_Open()) {
            return;
        }

        //90域原始数据元
        String origAcqInstIdCode = String.format("%0" + (11 - f90.getF90_4_OrigF32().length()) + "d", 0) + f90.getF90_4_OrigF32();
        String origFwdInstCode = String.format("%0" + (11 - f90.getF90_5_OrigF33().length()) + "d", 0) + f90.getF90_5_OrigF33();
        getCupsField().setOrigData(f90.getF90_1_OrigF0() + f90.getF90_2_OrigF11() + f90.getF90_3_OrigF7() +
                origAcqInstIdCode + origFwdInstCode);
    }

    public void build104() throws UnsupportedEncodingException {
        StringBuilder f104SubField = new StringBuilder();
        StringBuilder f104Field = new StringBuilder();
        // 无需组104
        if (f104 == null || !f104.isF104_Open()) {
            return;
        }

        // 组CC用法
        if (f104.isF104_CC_Open()) {
            f104SubField.append(f104.build104SubFieldWithStr(F104_CC_SubTagEnum._01_LICENSENO.getCupsTagName(), f104.getF104_CC_01())).
                    append(f104.build104SubFieldWithStr(F104_CC_SubTagEnum._02_ACCTNAME1.getCupsTagName(), f104.getF104_CC_02())).
                    append(f104.build104SubFieldWithStr(F104_CC_SubTagEnum._03_ACCTNAMEEXP1.getCupsTagName(), f104.getF104_CC_03())).
                    append(f104.build104SubFieldWithStr(F104_CC_SubTagEnum._04_ACCTNAME2.getCupsTagName(), f104.getF104_CC_04())).
                    append(f104.build104SubFieldWithStr(F104_CC_SubTagEnum._05_ACCTNAMEEXP2.getCupsTagName(), f104.getF104_CC_05())).
                    append(f104.build104SubFieldWithStr(F104_CC_SubTagEnum._06_RCVACCTNO.getCupsTagName(), f104.getF104_CC_06()));

            f104.build104Field(F104.CC_HEX, f104SubField, f104Field);
        }

        // 组MU用法
        if (f104.isF104_MU_Open()) {
            f104SubField.append(f104.build104SubFieldWithStr(F104_MU_SubTagEnum._01_BUSITYPE.getCupsTagName(), f104.getF104_MU_01())).
                    append(f104.build104SubFieldWithStr(F104_MU_SubTagEnum._02_FUNDUSE.getCupsTagName(), f104.getF104_MU_02()));

            f104.build104Field(F104.MU_HEX, f104SubField, f104Field);
        }

        // 组TO用法
        if (f104.isF104_TO_Open()) {
            f104SubField.append(f104.build104SubFieldWithStr(F104_TO_SubTagEnum._01_ENCALGORITHM.getCupsTagName(), f104.getF104_TO_01())).
                    append(f104.build104SubFieldWithStr(F104_TO_SubTagEnum._02_ENCDATA.getCupsTagName(), f104.getF104_TO_02())).
                    append(f104.build104SubFieldWithStr(F104_TO_SubTagEnum._03_CERTTYPE.getCupsTagName(), f104.getF104_TO_03()));

            f104.build104Field(F104.TO_HEX, f104SubField, f104Field);
        }

        getCupsField().setTermAttachData(f104Field.toString());
    }

    /**
     * 判断是否为无卡类交易 (ic/磁道)    无卡  无23序列号 且 无36二磁道
     *
     * @return
     */
    public boolean isNoCardTxn() {
        if (StringUtil.isEmptyOrNull(getCupsField().getCardSeqNo()) && StringUtil.isEmptyOrNull(getCupsField().getTrack2Data())) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断是否为磁道类交易      磁道    无23序列号 且 无36二磁道
     *
     * @return
     */
    public boolean isTrackTxn() {
        if (StringUtil.isEmptyOrNull(getCupsField().getCardSeqNo()) && !StringUtil.isEmptyOrNull(getCupsField().getTrack2Data())) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断是否为有卡类交易 (ic/磁道)     有卡   有23序列号 或 有36二磁道
     *
     * @return
     */
    public boolean isCardTxn() {
        if (!StringUtil.isEmptyOrNull(getCupsField().getCardSeqNo()) || !StringUtil.isEmptyOrNull(getCupsField().getTrack2Data())) {
            return true;
        } else {
            return false;
        }
    }

    public CupsField getCupsField() {
        return cupsField;
    }

    public void setCupsField(CupsField cupsField) {
        this.cupsField = cupsField;
    }

    public F60 createF60() {
        if (f60 == null) {
            f60 = new F60();
        }
        return f60;
    }

    public F61 createF61() {
        if (f61 == null) {
            f61 = new F61();
        }
        return f61;
    }

    public F90 createF90() {
        if (f90 == null) {
            f90 = new F90();
        }
        return f90;
    }

    public F104 createF104() {
        if (f104 == null) {
            f104 = new F104();
        }
        return f104;
    }

}
